package main

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

type Config struct {
	Port        int    `mapstructure:"port"` //不论使用什么格式（json/yaml/...）的，tag 都必须是 mapstructure！！！
	Version     string `mapstructure:"version"`
	MySQLConfig `mapstructure:"mysql"`
}

type MySQLConfig struct {
	Host   string `mapstructure:"host"`
	DBName string `mapstructure:"dbname"`
	Port   int    `mapstructure:"port"`
}

func main() {
	//设置默认值
	viper.SetDefault("fileDir", "./")
	//读取配置文件
	viper.SetConfigFile("./06_viper_demo/config.yaml") // 指定配置文件路径
	viper.SetConfigName("config")                      // 配置文件名称(无扩展名)
	viper.SetConfigType("yaml")                        // 指定配置文件类型（专门用于从远程获取配置信息时指定配置文件类型的）
	viper.AddConfigPath("/etc/appname/")               // 查找配置文件所在的路径
	viper.AddConfigPath("$HOME/.appname")              // 多次调用以添加多个搜索路径
	viper.AddConfigPath(".")                           // 还可以在工作目录中查找配置
	viper.AddConfigPath("./06_viper_demo")

	//加载配置文件出错时，可以这样处理找不到配置文件的特定情况
	if err := viper.ReadInConfig(); err != nil { // 查找并读取配置文件
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			//配置文件未找到错误，如果需要可以忽略
			panic(err)
		} else {
			//配置文件被找到，但产生了另外的错误
			panic(err)
		}
	}

	//实时监控配置文件的变化
	viper.WatchConfig() //确保在调用WatchConfig()之前添加了所有的配置路径。
	//当配置变化之后调用的一个回调函数
	viper.OnConfigChange(func(in fsnotify.Event) {
		//配置文件发生变更之后会调用的回调函数
		fmt.Println("Config file changed:", in.Name)
	})

	var c Config

	if err := viper.Unmarshal(&c); err != nil {
		fmt.Printf("viper.Unmarshal failed, err:%v\n", err)
		return
	}
	fmt.Printf("c: %#v\n", c)

	//r := gin.Default()
	//r.GET("/version", func(context *gin.Context) {
	//	context.String(http.StatusOK, viper.GetString("version"))
	//})
	//r.Run()
}
